//构造函数
//构造函数用于创建对象，在js中函数就是构造函数
//1.使用factory函数来模拟构造函数 
function factory(name,age){
    o={};
    o.name=name;
    o.age=age;
    return o;
}

var o1=factory('zhangsan',18);
var o2=factory('list',20);
console.log(o1,o2);
//2.js中内置大量的构造函数
var obj1=new Object();
var num1=new Number(23);
var str1=new String("hello");
//3.自定义构造函数
//构造函数的特点：1.首字母大写 2.使用new 关键字来创建对象 3.使用this关键字，指代本身
function Person(name,age){
    this.name=name;
    this.age=age;
    this.sayHello=function(message){
        console.log("sayHello"+message);
    }
}

var p1=new Person('zhangsan',18);
var p2=new Person('list',20);
console.log(p1,p2);
//私有成员，在构造函数中使用var定义的变量称为私有成员
//不可以直接使用name，必须要借助getName才能访问到name
function Person2(){
    var name="wangwu";
    this.getName=function(){
        return name;
    }
}
var p3=new Person2();
console.log(p3.name);//undefined
console.log(p3.getName());//wangwu
//return 构造函数中使用return，返回非对象，直接返回对象本身，
function Person3(){
    obj=this;
    return 123;
}
//函数中定义的变量只有在函数执行后才起作用
//this是指通过构造函数创建的对象
var p4=new Person3();
console.log(p4===obj);

function Person4(){
    obj2=this;
    return {};
}
var p5=new Person4();
console.log(p5===obj2);
//如果构造函数不使用new 关键字
var p6=new Person3(); 
console.log(p6);